Skip to main content

Ejemplo CNC 17: lectura de código G a partir de cadenas

Vea el CNC17_ReadGCodeFromStrings.project proyecto de ejemplo en el directorio de instalación de CODESYS en ..\CODESYS SoftMotion\Examples.

El proyecto de ejemplo muestra cómo usar SMC_StringStream2 para leer el código G de una cadena.

Este ejemplo puede verse como un punto de partida y usarse para leer código G de otras fuentes, por ejemplo, a través de la comunicación de red (sockets). En este caso, es necesario implementar un bloque de funciones que implemente SMC_ITextStream interactúa y lee el texto (por ejemplo, desde un socket). Esto es similar a cómo SMC_StringStream2 implementa esta interfaz para leer el código G de una cadena.

Estructura de la solicitud

La estructura es típica de las aplicaciones de CNC. El código G se lee en la tarea en segundo planoPathTask), y el preprocesamiento de rutas también tiene lugar aquí. La interpolación se realiza en la tarea del bus

En el Path programa, el SMC_ReadNCFromStream bloque de funciones se usa para leer el código G. Por razones técnicas, no solo es una secuencia de texto SMC_StringStream2 se pasa a este bloque de funciones, pero también a una matriz cuyo tamaño depende del parámetro SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH. La primera secuencia de la matriz se usa para el programa principal, mientras que las otras se usan para posibles llamadas a subprogramas

Al principio, el programa principal se carga en la primera secuencia de la matriz:

// Load G-Code into first stream
aStringStream[0].Init(sProgramName) ;
aStringStream[0].AppendData(sGCode) ;
aStringStream[0].SetEndOfData() ;

Entonces todo está preparado para leer los programas habituales de código G. El ejemplo también muestra cómo se pueden admitir las llamadas a subprogramas

Para ello, es necesario crear un bloque de funciones que implemente el SMC_INCLookup interfaz. Este bloque de funciones es responsable de devolver el código G de un subprograma cuando es leído por SMC_ReadNCFromStream. Lookup el método recibe el nombre del subprograma e inicializa una secuencia entrante con el código G:

METHOD LookUp : SMC_ERROR
VAR_IN_OUT CONSTANT
    programName : STRING;
END_VAR
VAR_INPUT
    stream : SMC_ITextStream;
END_VAR
VAR
    i : UDINT ;
    pStringStream : POINTER TO SMC_StringStream2 ;
END_VAR

En este ejemplo se busca en una serie de subprogramas. La matriz se define en Path programa como VAR_INPUT:

   // The table of subprograms.
   aSubs : ARRAY[0..0] OF SubProgram := [
            (stName := 'SUB1',
             stContent := '
SUBPROGRAM SUB1{#p1 : LREAL, #p2 : LREAL, #p3 : LREAL}
N10 G1 X#p1
N20 G1 X#p2
N30 G1 X#p3
END_SUBPROGRAM')
        ] ;

En Lookup, la matriz se repite hasta que se encuentra un subprograma con un nombre coincidente:

i := 0 ;
WHILE i < nNumSPs DO
    IF psp[i].stName = programName THEN
        IF NOT __QUERYPOINTER(stream, pStringStream) OR_ELSE
           pStringStream = 0
        THEN
            // A stream of the wrong type has been passed by SMC_ReadNCFromStream.
            LookUp := SMC_CNC_INTERNAL_ERROR ;
        ELSE
            pStringStream^.Init(sName := psp[i].stName) ;
            LookUp := pStringStream^.AppendData(psp[i].stContent) ;
            pStringStream^.SetEndOfData() ;
        END_IF
        RETURN ;
    END_IF

    i := i + 1 ;
END_WHILE
 
// No subprogram with name programName has been found in the array psp.
LookUp := SMC_RNCF_SUBPROGRAM_FILE_NOT_FOUND ;

Puesta en servicio

  1. Cree la aplicación y descárguela en un controlador.

  2. Abra la visualización.

  3. Prensa Comenzar para iniciar el procesamiento del código G.